package field

import (
	"fmt"
	"strings"
	"yunj/pkg/yunj/core/builder/builderdto"
	"yunj/pkg/yunj/core/builder/form"
	"yunj/pkg/yunj/util"
)

// 表格
type Table struct {
	form.Field
	Cols       []builderdto.FormTableCol `json:"cols"`       // 表头列
	MaxHeight  uint                      `json:"maxHeight"`  // 表格容器最大高度，单位px
	AddAction  bool                      `json:"addAction"`  // 开启添加按钮
	DelAction  bool                      `json:"delAction"`  // 开启删除按钮
	SortAction bool                      `json:"sortAction"` // 开启排序操作
}

func NewTable(id string, title ...string) *Table {
	f := &Table{}
	form.SetFieldInstance(&f.Field, f)
	f.SetFieldId(id)
	if len(title) > 0 {
		f.SetTitle(title[0])
	}
	return f
}

// 设置标题
func (f *Table) SetTitle(title string) *Table {
	f.Title = title
	return f
}

// 设置默认值
func (f *Table) SetDefault(def any) *Table {
	f.Default = def
	return f
}

// 设置描述
func (f *Table) SetDesc(desc string) *Table {
	f.Desc = desc
	return f
}

// 设置验证规则
func (f *Table) SetVerify(rule string) *Table {
	f.Verify = rule
	return f
}

// 设置验证标题
func (f *Table) SetVerifyTitle(verifyTitle string) *Table {
	f.VerifyTitle = verifyTitle
	return f
}

// 增加验证规则
func (f *Table) AddVerify(rule string) *Table {
	f.AddFieldVerify(rule)
	return f
}

// 设置是否只读
func (f *Table) SetReadonly(yes bool) *Table {
	f.Readonly = yes
	return f
}

// 设置栅格布局
// 超小屏幕(手机<768px)、小屏幕(平板≥768px)、中等屏幕(桌面≥992px)、大型屏幕(桌面≥1200px)、超大屏幕(桌面≥1400px)
// 总列数：12
func (f *Table) SetGrid(num ...any) *Table {
	f.Grid = num
	return f
}

// 设置权限
func (f *Table) SetAuth(auth string) *Table {
	f.Auth = auth
	return f
}

// 设置表头列
func (f *Table) SetCols(cols []builderdto.FormTableCol) *Table {
	f.Cols = cols
	return f
}

// 设置表格容器最大高度，单位px
func (f *Table) SetMaxHeight(height uint) *Table {
	f.MaxHeight = height
	return f
}

// 设置开启添加按钮
func (f *Table) SetAddAction(enable bool) *Table {
	f.AddAction = enable
	return f
}

// 设置开启删除按钮
func (f *Table) SetDelAction(enable bool) *Table {
	f.DelAction = enable
	return f
}

// 设置开启排序操作
func (f *Table) SetSortAction(enable bool) *Table {
	f.SortAction = enable
	return f
}

// 处理属性
func (f *Table) HandleAttr() error {
	if f.Cols == nil || len(f.Cols) <= 0 {
		return f.SetError("表头列 Cols 未配置！")
	}
	if f.MaxHeight == 0 {
		f.MaxHeight = 300
	}
	for i, col := range f.Cols {
		if col.Title == "" {
			return f.SetError(fmt.Sprintf("表头列[%v] Title 不能为空", i))
		}
		if col.Field == "" {
			return f.SetError(fmt.Sprintf("表头列[%v] Field 未配置", i))
		}
		if strings.Contains(f.Verify, "table") {
			return f.SetError(fmt.Sprintf("表头列[%v] Verify 验证规则不能包含table", i))
		}
	}
	if !strings.Contains(f.Verify, "table") {
		colsJson, err := util.ToJson(f.Cols)
		if err != nil {
			return f.SetError(fmt.Sprintf("表头列 cols 转换json异常！%v", err))
		}
		base64Cols := util.Base64Encode(colsJson)
		if f.Verify == "" {
			f.Verify = "table:" + base64Cols
		} else {
			f.Verify += "|table:" + base64Cols
		}
	}
	return nil
}
